package Controllers;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.HashSet;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.torque.NoRowsException;
import org.apache.torque.TooManyRowsException;
import org.apache.torque.TorqueException;

import Models.Etudiant;
import Models.Groupe;
import Models.GroupePeer;
import Models.Module;
import Models.ModulePeer;
import Models.Note;
import Models.NotePeer;

@SuppressWarnings("serial")
public class NotesController extends MainController {
	
	private String selectView, addView, confirmView;
	
	public void init() throws ServletException {
		this.selectView	= this.getInitParameter("view_select");
		this.addView	= this.getInitParameter("view_add");
		this.confirmView= this.getInitParameter("view_confirm");
	}
	
	public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		String method = request.getMethod().toLowerCase();
		String action = request.getPathInfo();
		if (action == null) {
			action = "/";
			System.out.println("action == null");
		}
		// Si on ajoute une note et qu'on a sélectionné le groupe et le module
		if (method.equals("post") && action.equals("/add")) {
			request.setAttribute("title", "Ajouter une note");
			this.add(request, response);
		} else if (method.equals("post") && action.equals("/select")) {
			request.setAttribute("title", "Ajouter une note");
			this.select(request, response);
		}
	}
	
	/**
	 * Dispatcher vers les différentes fonctions finales d'action en fonction de l'action appelée
	 */
	public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
		String method = request.getMethod().toLowerCase();
		String action = request.getPathInfo();
		if (action == null) {
			action = "/";
			System.out.println("action == null");
		}
		// Si on ajoute une note
		if (method.equals("get") && action.equals("/add")) {
			request.setAttribute("title", "Ajouter une note");
			this.add(request, response);
		} else if (method.equals("get") && action.equals("/select")) {
			request.setAttribute("title", "Ajouter une note");
			this.select(request, response);
		} 
	}
	
	/**
	 * Ajout de notes, est appelé lors d'un premier post (sélection groupe/module)
	 * 
	 * @param request
	 * @param response
	 * @throws ServletException
	 * @throws IOException
	 */
	private void add(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// Si on a posté le formulaire d'ajout de note
		if (request.getParameter("note") != null) {
			Enumeration<String> params = request.getParameterNames();
			int idModule = Integer.parseInt(request.getParameter("id_module"));
			// Pour chaque étudiant, on récupère la note que l'on a affecté
			try {
				while (params.hasMoreElements()) {
					String idEtudiant = params.nextElement();
					if ((!idEtudiant.equals("note") &&
							!idEtudiant.equals("id_groupe") && 
							!idEtudiant.equals("id_module")) &&
							!request.getParameter(idEtudiant).isEmpty())
					{
						Note note = new Note();
						note.setIdEtudiant(Integer.parseInt(idEtudiant));
						note.setIdModule(idModule);
						note.setNote(Double.parseDouble(request.getParameter(idEtudiant)));
						note.setNew(false);
						NotePeer.doUpdate(note);
					}
				}
			} catch (NumberFormatException e) {
				e.printStackTrace();
			} catch (TorqueException e) {
				e.printStackTrace();
			} catch (Exception e) {
				e.printStackTrace();
			}
			request.setAttribute("title", "Notes ajoutées");
			this.loadJSP(this.confirmView, request, response);
		} else {
			// On affiche les étudiants du groupe et du module choisis
//			String module = request.getParameter("module");
			int id_groupe = Integer.parseInt(request.getParameter("id_groupe"));
			Groupe groupe = new Groupe();
			Module module = new Module();
			ArrayList<Note> notes_module = new ArrayList<Note>(); 
			try {
				groupe = GroupePeer.retrieveByPK(id_groupe);
				module = ModulePeer.retrieveByPK(Integer.parseInt(request.getParameter("module")));
				notes_module = NotePeer.getNotesModule(module, groupe);
			} catch (NoRowsException e) {
				e.printStackTrace();
			} catch (TooManyRowsException e) {
				e.printStackTrace();
			} catch (TorqueException e) {
				e.printStackTrace();
			}
			request.setAttribute("groupe", groupe);
			request.setAttribute("module", module);
			request.setAttribute("notes", notes_module);
			this.loadJSP(this.addView, request, response);
		}
	}
	
	/**
	 * Selection du module et groupe pour lequel on veut mettre les notes
	 * 
	 * @param request
	 * @param response
	 * @throws ServletException
	 * @throws IOException
	 */
	private void select(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		String id_module = null;
		List<Groupe> grp = new ArrayList<Groupe>();
		Groupe groupe = new Groupe();
		List modules = new ArrayList<Module>();
		if( request.getParameter("group") == null ) {
			grp = GroupePeer.doSelectAll();
		} else {
			id_module = request.getParameter("group");
		}
		
		if( id_module != null ) {
			try {
				groupe = GroupePeer.retrieveByPK(Integer.parseInt(id_module));
				modules = ModulePeer.doSelectByGroupe(groupe);
			} catch (NoRowsException e) {
				e.printStackTrace();
			} catch (TooManyRowsException e) {
				e.printStackTrace();
			} catch (NumberFormatException e) {
				e.printStackTrace();
			} catch (TorqueException e) {
				e.printStackTrace();
			}
		}
		request.setAttribute("groupes", grp);
		request.setAttribute("groupe", groupe);
		request.setAttribute("modules", modules);
		this.loadJSP(this.selectView, request, response);
	}
}
